package org.example.service;


import org.apache.commons.beanutils.PropertyUtils;
import org.example.dto.DeptDto;
import org.example.entity.SysDept;
import org.example.mapper.SysDeptMapper;
import org.example.model.DeptModel;

import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class SysDeptService {
    @Resource
    private SysDeptMapper sysDeptMapper;


    public List<SysDept> getAll(){

        return sysDeptMapper.getData();
    }
//
    public List<DeptModel> getDeptTree() {

        List<SysDept> sysDeptList = sysDeptMapper.getData();

//        System.out.println("dept-service数据处理前的树形递归结果："+sysDeptList);

        List<DeptModel> rootDeptModels =
                sysDeptList.stream()
                .filter(sm -> sm.getParentId() == null || sm.getParentId() == 0)
                //
                .map(this::convertSysDeptModel).collect(Collectors.toList());


        System.out.println("rootDeptModels:"+rootDeptModels);
        // 构建递归树， 据顶级菜单往下挂儿子菜单或者孙子菜单；
        generateRecursionDepts(rootDeptModels, sysDeptList);


        //写渲染meta级联表单的数据
//        getMetaTree(rootDeptModels);

        System.out.println("dept的递归树的结果为: "+rootDeptModels);

//        getMetaTree(rootDeptModels);

        return rootDeptModels;
//        return sysDeptMapper.getData();

    }
    private void generateRecursionDepts(List<DeptModel> deptModels, List<SysDept> sysDeptList) {
        // null == menuModels || menuModels.isEmpty()
        if(!CollectionUtils.isEmpty(deptModels)) {
            // 循环获取每个路由，然后挂儿子路由: 儿子的parentId == 等于它的id
            deptModels.forEach(m -> {
                // 获取当前路由的id, 根据id找儿子(儿子的parentId为当前路由的id)
                Integer id = m.getId();
                /**
                 * Integer的值 [-128, 127]
                 *
                 *
                 * 2.filter(sm -> sm.getParentId().equals(id)) 找到所有的儿子菜单
                 * 2.map(this::convertSysMenuToModelModel) 将找到的儿子转换 MenuModel
                 */
                List<DeptModel> children = sysDeptList.stream()
                        .filter(sm -> id.equals(sm.getParentId()))

                        .map(this::convertSysDeptModel).collect(Collectors.toList());

                //xxxuollc:添加了一个功能（解决parent问题），把父级的名字放到儿子的parent属性里（方便之后渲染级联的lable和value属性）
                children.forEach(i->{
                    i.setParent(m.getName());

//                    i.setLabel(i.getName());
//                    i.setValue(i.getParentId());
//                    m.setLabel(m.getName());
//                    m.setValue(m.getParentId());



                });
//                System.out.println("父级的名字："+m.getName()+"children：------------------->>"+children);

                if(!CollectionUtils.isEmpty(children)) {
                    // 将儿子路由塞进去
                    m.setChildren(children);
//                    System.out.println("塞儿子-===========>"+children);
                    // 接着构建儿子的后代路由
                    generateRecursionDepts(children, sysDeptList);
                }
            });
        }
    }

    //后台查询的数据，转换为model类型
    private DeptModel convertSysDeptModel(SysDept sysDept) {
        /**
         * PropertyUtils.copyProperties(); 将源对象中属性拷贝到目标对象中, 接受两个参数：
         *   1.第一个参数是目标对象；
         *   2.第二个参数是源对象；
         *  能够拷贝的前提是他们拥有者相同的属性
         */
        DeptModel.Meta meta = new DeptModel.Meta();
        DeptModel model = new DeptModel();
        try {

            PropertyUtils.copyProperties(meta, sysDept);
            meta.setLabel(sysDept.getName());
            meta.setValue(sysDept.getName());
//            System.out.println("getchildren的值："+model.getChildren());
            meta.setChildren(model.getChildren());
            PropertyUtils.copyProperties(model, sysDept);
            model.setMeta(meta);
            // 0表示顶级菜单，定义菜单的 component是 Layout; 儿子菜单的 component的值不是 “Layout”
            if(sysDept.getParentId() == null) {
//                model.setParentId(0);



            }else {



            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return model;
    }
    //删除数据
    public void delete(Long id){
        sysDeptMapper.delete(id);
    }

    //编辑数据
//    @PutMapping
//    public Map<String, Object> edit(DeptDto deptDto) {
////        sysDeptMapper.edit(deptDto);
//        return ImmutableMap.of("code", 1, "msg", "success");
//    }
    //回显操作
    public SysDept getById(Long id) {
        return sysDeptMapper.selectById(id);
    }

    //编辑数据
    public void edit(DeptDto deptDto) {
//        System.out.println("service--------传过来的id"+deptDto.getId());
        sysDeptMapper.updateById(deptDto);
    }

    //添加数据
    public void add(DeptDto deptDto) {
//        System.out.println("service--------deptDto.getCreateBy()"+deptDto.getCreateBy());
        sysDeptMapper.insert(deptDto);
    }

//    private void getMetaTree(List<DeptModel> deptModels){
//
//
//
//        generateMetaDept(deptModels);
//
//
//
//
//
//
//
//    }
//
//    private void generateMetaDept(List<DeptModel> deptModels){
//
//        if(!CollectionUtils.isEmpty(deptModels)) {
//            // 循环获取每个路由，然后挂儿子路由: 儿子的parentId == 等于它的id
//            deptModels.forEach(m -> {
//
////                System.out.println("meta的m值为："+m);
//
//                List<DeptModel> children = deptModels.stream()
//                        .filter(sm -> m.getId().equals(sm.getParentId()))
//                        .map(this::convertMetaModel).collect(Collectors.toList());
//
//                if(!CollectionUtils.isEmpty(m.getChildren())) {
//                    // 将儿子路由塞进去
//
////                    System.out.println("meta的递归-===========>"+m.getChildren());
//                    // 接着构建儿子的后代路由
//                    generateMetaDept(m.getChildren());
//                }
//
//
//
//            });
//        }
//
//    }
//
//
//    private DeptModel convertMetaModel(DeptModel deptModel) {
//
//        DeptModel.Meta meta = new DeptModel.Meta();
//        DeptModel model = new DeptModel();
//        try {
//
//            System.out.println("getchildren的值：" + model.getChildren());
//            meta.setChildren(model.getChildren());
//
//            model.setMeta(meta);
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return model;
//    }


}
